/**
 * 1
 *  
 * @Author : Ruoyu Wang
 * @DateTime : 24-10-17 下午4:12
 */

#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>

using namespace std;

double f(double x, double a, double b, double c, double d) {
    return a * x * x * x + b * x * x + c * x + d;
}

double findRoot(double a, double b, double c, double d, double left, double right) {
    double mid;
    while (right - left > 1e-7) {
        mid = (left + right) / 2.0;
        if (f(left, a, b, c, d) * f(mid, a, b, c, d) <= 0)
            right = mid;
        else
            left = mid;
    }
    return (left + right) / 2.0;
}

int main() {
    double a, b, c, d;
    cin >> a >> b >> c >> d;

    vector<double> roots;

    for (double i = -100; i <= 100; i += 1.0) {
        if (f(i, a, b, c, d) == 0) {
            roots.push_back(i);
        } else if (f(i, a, b, c, d) * f(i + 1, a, b, c, d) < 0) {
            roots.push_back(findRoot(a, b, c, d, i, i + 1));
        }
    }

    sort(roots.begin(), roots.end());

    cout << fixed << setprecision(2) << roots[0] << " " << roots[1] << " " << roots[2];

    return 0;
}